package com.system.insurance.utils;


import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder;
import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner;
import com.wechat.pay.contrib.apache.httpclient.auth.Verifier;
import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Credentials;
import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Validator;
import com.wechat.pay.contrib.apache.httpclient.cert.CertificatesManager;
import com.wechat.pay.contrib.apache.httpclient.util.AesUtil;
import com.wechat.pay.contrib.apache.httpclient.util.PemUtil;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.http.impl.client.CloseableHttpClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.util.Base64;
import java.util.Map;
import java.util.UUID;

//@AllArgsConstructor
//@NoArgsConstructor
@Data
@Configuration
public class WePayConfig {
    protected static final Logger log = LoggerFactory.getLogger(WechatPay2Validator.class);
//    // APPID
//    @Value("${wx.pay.appId}")
//    private String appId;
//    // 商户号
//    @Value("${wx.pay.mchId}")
//    private String mchId;
//    // 商户秘钥
//    @Value("${wx.pay.mchKey}")
//    private String mchKey;
//    // APIv3密钥
//    @Value("${wx.pay.apiV3Key}")
//    private String apiV3Key;
//
//    @Value("${wx.pay.notifyUrl}")
//    private String notifyUrl;
//    // api证书商户序列号
//    @Value("${wx.pay.mchserial}")
//    private String mchSerialNo;
//    //小程序密匙
//    @Value("${wx.pay.appSecret}")
//    private String appSecret;
//
//
//    /**
//     * 获取商户的私钥文件
//     *
//     * @param
//     * @return
//     */
//    public PrivateKey getPrivateKey() {
//        log.info("正在获取文件位置==================");
//        try {
//            log.info("文件位置获取中==================");
//            InputStream inputStream = InputStreamUtils.getInputStream();
//            log.info(String.valueOf(inputStream));
//            return PemUtil.loadPrivateKey(inputStream);
//        } catch (IOException e) {
//            throw new RuntimeException("私钥文件不存在", e);
//        }
//    }
//
//
//    public static void main(String[] args) throws IOException {
//
//
//    }
//
//
//    /**
//     * 获取签名验证器
//     *
//     * @return
//     */
//    @Bean
//    public Verifier getVerifier() throws Exception {
//        log.info("获取签名验证器=====================");
//        //return null;
//        //获取商户私钥
//        log.info("商户私钥获取中=============");
//        PrivateKey privateKey = getPrivateKey();
//        log.info("商户私钥获取中{}；" + privateKey.toString());
//        // 私钥签名对象
//        PrivateKeySigner keySigner = new PrivateKeySigner(mchSerialNo, privateKey);
//        // 身份认证对象
//        WechatPay2Credentials wechatPay2Credentials = new WechatPay2Credentials(mchId, keySigner);
//        // 获取证书管理器实例
//        CertificatesManager certificatesManager = CertificatesManager.getInstance();
//        // 向证书管理器增加需要自动更新平台证书的商户信息
//        certificatesManager.putMerchant(mchId, wechatPay2Credentials,
//                apiV3Key.getBytes(StandardCharsets.UTF_8));
//        // ... 若有多个商户号，可继续调用putMerchant添加商户信息
//        Verifier verifier = certificatesManager.getVerifier(mchId);
//        log.info("获取签名验证器结束====================");
//        return verifier;
//    }
//
//
//
//    /**
//     * 获取http请求对象
//     *
//     * @param verifier
//     * @return
//     */
//    @Bean("wxPayClient")
//    public CloseableHttpClient getWxPayClient(Verifier verifier) {
//        log.info("获取http请求对象==================");
//        //获取商户私钥
//        log.info("商户私钥获取中=============");
//        PrivateKey privateKey = getPrivateKey();
//        log.info("商户私钥获取中{}；" + privateKey.toString());
//        // 从证书管理器中获取verifier
//        WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
//                .withMerchant(mchId, mchSerialNo, privateKey)
//                .withValidator(new WechatPay2Validator(verifier));
//
//        // 通过WechatPayHttpClientBuilder构造的HttpClient，会自动的处理签名和验签，并进行证书自动更新
//        CloseableHttpClient httpClient = builder.build();
//        log.info("获取http请求对象结束===================");
//        return httpClient;
//    }
//
//
//    /**
//     * 获取HttpClient，无需进行应答签名验证，跳过验签的流程
//     */
//    @Bean(name = "wxPayNoSignClient")
//    public CloseableHttpClient getWxPayNoSignClient() {
//        log.info("获取HttpClient，无需进行应答签名验证，跳过验签的流程");
//
//        //获取商户私钥
//        log.info("商户私钥获取中=============");
//        PrivateKey privateKey = getPrivateKey();
//        log.info("商户私钥获取中{}；" + privateKey.toString());
//
//        //用于构造HttpClient
//        WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
//                //设置商户信息
//                .withMerchant(mchId, mchSerialNo, privateKey)
//                //无需进行签名验证、通过withValidator((response) -> true)实现
//                .withValidator((response) -> true);
//
//        // 通过WechatPayHttpClientBuilder构造的HttpClient，会自动的处理签名和验签，并进行证书自动更新
//        CloseableHttpClient httpClient = builder.build();
//        log.info("获取HttpClient，无需进行应答签名验证，跳过验签的流程结束=================");
//        log.info("== getWxPayNoSignClient END ==");
//        return httpClient;
//    }
//
//
//    public String decryptFromResource(Map<String, Object> bodyMap) throws GeneralSecurityException {
//
//        log.info("秘文解密================");
//        //通知数据
//        Map<String, String> resourceMap = (Map<String, String>) bodyMap.get("resource");
//        //数据秘文
//        String ciphertext = resourceMap.get("ciphertext");
//        //获取随机串
//        String nonce = resourceMap.get("nonce");
//        String associated_data = resourceMap.get("associated_data");
//
//        log.info("秘文===》{}", ciphertext);
//        AesUtil aesUtil = new AesUtil(getApiV3Key().getBytes(StandardCharsets.UTF_8));
//        //获取明文（解密后的数据）
//        String plainText = aesUtil.decryptToString(associated_data.getBytes(StandardCharsets.UTF_8),
//                nonce.getBytes(StandardCharsets.UTF_8),
//                ciphertext);
//
//        log.info("明文====》{}", plainText);
//
//        return plainText;
//    }
//
//
//    /**
//     * 拼接五个参数
//     *
//     * @param appId
//     * @param timestamp
//     * @param nonceStr
//     * @param packag
//     * @return
//     */
//    public String buildMessageTwo(String appId, long timestamp, String nonceStr, String packag) {
//        log.info("拼接五个参数");
//        return appId + "\n"
//                + timestamp + "\n"
//                + nonceStr + "\n"
//                + packag + "\n";
//
//    }
//
//    /**
//     * 进行二次封装
//     *
//     * @param
//     * @param message
//     * @return
//     * @throws NoSuchAlgorithmException
//     * @throws SignatureException
//     * @throws IOException
//     * @throws InvalidKeyException
//     * @throws InvalidKeyException
//     */
//    public String sign(byte[] message) throws NoSuchAlgorithmException, SignatureException, IOException, InvalidKeyException, InvalidKeyException {
//        log.info("进行二次封装");
//        Signature sign = Signature.getInstance("SHA256withRSA"); //SHA256withRSA
//        InputStream inputStream = InputStreamUtils.getInputStream();
//        log.info("数据签名校验===============================" + String.valueOf(inputStream));
//
////        sign.initSign(PemUtil.loadPrivateKey(new FileInputStream(wxCertPath))); // 微信证书私钥
//        sign.initSign(PemUtil.loadPrivateKey(inputStream));
//        sign.update(message);
//        return Base64.getEncoder().encodeToString(sign.sign());
//    }
//
//    /**
//     * 获取32位随机字符串
//     *
//     * @return
//     */
//    public String getNonceStr() {
//        return UUID.randomUUID().toString()
//                .replaceAll("-", "")
//                .substring(0, 32);
//    }
//
//    /**
//     * 获取当前时间戳，单位秒
//     *
//     * @return
//     */
//    public long getCurrentTimestamp() {
//        return System.currentTimeMillis() / 1000;
//    }
}
